
float sdBox(vector p, vector b)
{
  vector d = abs(p) - b;
  return min(max(d[0],max(d[1],d[2])),0.0) + length(max(d,0.0));
}

float displace()
{
    return 0.001*length(P);
}

float smax(float a,  float b, float k)
{
    return log(exp(k*a) + exp(k*b)) / k;
}

float smin( float a, float b, float k )
{
    float res = exp( -k*a ) + exp( -k*b );
    return -log( res )/k;
}

vector map(vector p, vector spherePos, float k)
{
   float d = sdBox(p,vector(1.0));

   float s = 1.0;
   for( int m=0; m<8; m++ )
   {
      vector a = mod( p*s, 2.0 )-1.0;
      s *= 3.0;
      vector r = abs(1.0 - 3.0*abs(a));

      float da = max(r[0],r[1]);
      float db = max(r[1],r[2]);
      float dc = max(r[2],r[0]);
      float c = (smin(da,smin(db,dc, k), k)-1.0)/s;

      d = max(d,c);
   }

   return vector(d, u, v);
}



shader Menger(
    vector       spherePos = vector(1,1,1),
    float        k = 1,
    output color c = 0)
{
    // rescale the roundedness to [0,1]
    float s = 35*(1 - k) + 1;
    c = map(P, spherePos, s);
}
